﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using ibba.src.DataAccess;
using ibba.src.global;
using ibba.src.norisk.Contracts;

namespace ibba.src.norisk.DataAccess
{
    public class DeParaAreaSubLimiteDB : DataAccessBase
    {
        /// <summary>
        /// Recupera dos dominios de tipo limite;
        /// </summary>
        /// <returns>Colecao de tipos de limites</returns>
        public List<AreaSubLimite> ObterAreasSubLimite()
        {
            var retorno = new List<AreaSubLimite>();
            var parametros = new List<IDataParameter>();

            parametros.Add(AcessoDadosHelper.CriarParametro("@pID_FLUXO", DbType.Int16, 3)); //aprovado
            parametros.Add(AcessoDadosHelper.CriarParametro("@pIND_ATIV_INAT", DbType.Int16, DBNull.Value));

            using (AcessoDadosHelper db = new AcessoDadosHelper(GlobalInfo.SISTEMA, GlobalInfo.LOCAL))
            {

                using (IDataReader rdr = db.ExecuteReader(CommandType.StoredProcedure,
                                                          "DBO.SRCP_OBTER_AREAS_SUB_LIMITE", parametros))
                {
                    while (rdr.Read())
                    {
                        retorno.Add(new AreaSubLimite()
                        {
                            IdAreaLimite = (short)base.ObterValor(rdr, "IDT_AREA_INSL_CRED"),
                            DescAreaLimite = (string)base.ObterValor(rdr, "NOM_AREA_INSL_CRED"),
                            IdAreaSubLimite = (short)base.ObterValor(rdr, "IDT_SUB_AREA_INSL_CRED"),
                            DescAreaSubLimite = (string)base.ObterValor(rdr, "NOM_SUB_AREA_INSL_CRED"),
                            Ativo = Convert.ToBoolean(base.ObterValor(rdr, "IND_ATIV_INAT"))
                        });
                    }
                }
            }

            return retorno;
        }

        public DeParaAreaSubLimite ObterDeParaAreaSubLimite(int pIdAreaSubLimite)
        {
            var retorno = new DeParaAreaSubLimite();
            var parametros = new List<IDataParameter>();

            parametros.Add(AcessoDadosHelper.CriarParametro("@pID_AREA_SUBLIMITE", DbType.Int16, pIdAreaSubLimite));

            using (AcessoDadosHelper db = new AcessoDadosHelper(GlobalInfo.SISTEMA, GlobalInfo.LOCAL))
            {
                using (DataSet ds = db.ExecuteDataset(CommandType.StoredProcedure,
                                                      "DBO.SRCP_OBTER_DEPARA_AREA_SUBLIMITE", parametros))
                {
                    DataTable dtAreaSubLimite = ds.Tables[0];
                    DataTable dtProdutoItau = ds.Tables[1];
                    DataTable dtEstrategia = ds.Tables[2];
                    DataTable dtAreaInst = ds.Tables[3];

                    if (dtAreaSubLimite.Rows.Count > 0)
                    {
                        DataRow drAreaSL = dtAreaSubLimite.Rows[0];

                        retorno.IdAreaLimite = (short)drAreaSL["IDT_AREA_INSL_CRED"];
                        retorno.DescAreaLimite = (string)drAreaSL["NOM_AREA_INSL_CRED"];
                        retorno.IdAreaSubLimite = (short)drAreaSL["IDT_SUB_AREA_INSL_CRED"];
                        retorno.DescAreaSubLimite = (string)drAreaSL["NOM_SUB_AREA_INSL_CRED"];
                        retorno.Ativo = Convert.ToBoolean(drAreaSL["IND_ATIV_INAT"]);

                        retorno.ProdutosItau = new List<DeParaProdutoItau>();
                        retorno.Estrategias = new List<DeParaEstrategia>();
                        retorno.AreasInstitucionais = new List<DeParaAreaInstitucional>();

                        foreach (DataRow drProd in dtProdutoItau.Rows)
                        {
                            retorno.ProdutosItau.Add(new DeParaProdutoItau()
                            {
                                IdDePara = (int)drProd["ID_DEPARA_TIPO_LIMITE_PRODUTO"],
                                Codigo = (string)drProd["CD_CHV_PRODUTO_NC"],
                                Descricao = (string)drProd["DS_PRODUTO_NC"],
                                CodUsuarioIncluiu = (string)drProd["CD_USUARIO_INCLUSAO"],
                                DataInclusao = (DateTime)drProd["DT_INCLUSAO"],
                                UtilizaProcessamento = Convert.ToBoolean((int)drProd["IND_ATIV_INAT_PSST"])
                            });
                        }

                        foreach (DataRow drEst in dtEstrategia.Rows)
                        {
                            retorno.Estrategias.Add(new DeParaEstrategia()
                            {
                                IdDePara = (int)drEst["ID_DEPARA_TIPO_LIMITE_ESTRATEGIA"],
                                Codigo = (int)drEst["ID_ESTRATEGIA"],
                                Descricao = (string)drEst["DS_ESTRATEGIA"],
                                CodUsuarioIncluiu = (string)drEst["CD_USUARIO_INCLUSAO"],
                                DataInclusao = (DateTime)drEst["DT_INCLUSAO"],
                                UtilizaProcessamento = Convert.ToBoolean((int)drEst["IND_ATIV_INAT_PSST"])
                            });
                        }

                        foreach (DataRow drArea in dtAreaInst.Rows)
                        {
                            retorno.AreasInstitucionais.Add(new DeParaAreaInstitucional()
                            {
                                IdDePara = (int)drArea["IDT_ASSOC_TIP_LIM_AREA_INST"],
                                Codigo = (int)drArea["COD_AREA_INST"],
                                Descricao = (string)drArea["DS_AREA_INST"],
                                CodUsuarioIncluiu = (string)drArea["COD_USUA_INCU"],
                                DataInclusao = (DateTime)drArea["DAT_INCU"],
                                UtilizaProcessamento = Convert.ToBoolean((int)drArea["IND_ATIV_INAT_PSST"])
                            });
                        }
                    }

                }
            }

            return retorno;
        }

        public List<DeParaAreaSubLimite> ObterTodos()
        {
            var retorno = new List<DeParaAreaSubLimite>();            
            var parametros = new List<IDataParameter>();

            parametros.Add(AcessoDadosHelper.CriarParametro("@pID_AREA_SUBLIMITE", DbType.Int16, DBNull.Value));

            using (AcessoDadosHelper db = new AcessoDadosHelper(GlobalInfo.SISTEMA, GlobalInfo.LOCAL))
            {
                using (DataSet ds = db.ExecuteDataset(CommandType.StoredProcedure,
                                                      "DBO.SRCP_OBTER_DEPARA_AREA_SUBLIMITE", parametros))
                {
                    DataTable dtAreaSubLimite = ds.Tables[0];
                    DataTable dtProdutoItau = ds.Tables[1];
                    DataTable dtEstrategia = ds.Tables[2];
                    DataTable dtAreaInst = ds.Tables[3];

                    if (dtAreaSubLimite.Rows.Count > 0)
                    {
                        DeParaAreaSubLimite dp = new DeParaAreaSubLimite();

                        foreach (DataRow drAreaSL in dtAreaSubLimite.Rows)
                        {
                            dp = new DeParaAreaSubLimite
                                 {
                                    IdAreaLimite = (short)drAreaSL["IDT_AREA_INSL_CRED"],
                                    DescAreaLimite = (string)drAreaSL["NOM_AREA_INSL_CRED"],
                                    IdAreaSubLimite = (short)drAreaSL["IDT_SUB_AREA_INSL_CRED"],
                                    DescAreaSubLimite = (string)drAreaSL["NOM_SUB_AREA_INSL_CRED"],
                                    Ativo = Convert.ToBoolean(drAreaSL["IND_ATIV_INAT"]),
                                    ProdutosItau = new List<DeParaProdutoItau>(),
                                    Estrategias = new List<DeParaEstrategia>(),
                                    AreasInstitucionais = new List<DeParaAreaInstitucional>()
                                 };
                            
                            foreach (DataRow drProd in dtProdutoItau.Rows)
                            {
                                if ((short)drProd["IDT_SUB_AREA_INSL_CRED"] == dp.IdAreaSubLimite)
                                {
                                    dp.ProdutosItau.Add(new DeParaProdutoItau()
                                    {
                                        IdDePara = (int)drProd["ID_DEPARA_TIPO_LIMITE_PRODUTO"],
                                        Codigo = (string)drProd["CD_CHV_PRODUTO_NC"],
                                        Descricao = (string)drProd["DS_PRODUTO_NC"],
                                        CodUsuarioIncluiu = (string)drProd["CD_USUARIO_INCLUSAO"],
                                        DataInclusao = (DateTime)drProd["DT_INCLUSAO"],
                                        UtilizaProcessamento = Convert.ToBoolean((int)drProd["IND_ATIV_INAT_PSST"])
                                    });
                                }
                            }

                            foreach (DataRow drEst in dtEstrategia.Rows)
                            {
                                if ((short)drEst["IDT_SUB_AREA_INSL_CRED"] == dp.IdAreaSubLimite)
                                {
                                    dp.Estrategias.Add(new DeParaEstrategia()
                                    {
                                        IdDePara = (int)drEst["ID_DEPARA_TIPO_LIMITE_ESTRATEGIA"],
                                        Codigo = (int)drEst["ID_ESTRATEGIA"],
                                        Descricao = (string)drEst["DS_ESTRATEGIA"],
                                        CodUsuarioIncluiu = (string)drEst["CD_USUARIO_INCLUSAO"],
                                        DataInclusao = (DateTime)drEst["DT_INCLUSAO"],
                                        UtilizaProcessamento = Convert.ToBoolean((int)drEst["IND_ATIV_INAT_PSST"])
                                    });
                                }
                            }

                            foreach (DataRow drArea in dtAreaInst.Rows)
                            {
                                if ((short)drArea["IDT_SUB_AREA_INSL_CRED"] == dp.IdAreaSubLimite)
                                {
                                    dp.AreasInstitucionais.Add(new DeParaAreaInstitucional()
                                    {
                                        IdDePara = (int)drArea["IDT_ASSOC_TIP_LIM_AREA_INST"],
                                        Codigo = (int)drArea["COD_AREA_INST"],
                                        Descricao = (string)drArea["DS_AREA_INST"],
                                        CodUsuarioIncluiu = (string)drArea["COD_USUA_INCU"],
                                        DataInclusao = (DateTime)drArea["DAT_INCU"],
                                        UtilizaProcessamento = Convert.ToBoolean((int)drArea["IND_ATIV_INAT_PSST"])
                                    });
                                }
                            }

                            retorno.Add(dp);
                        }
                        
                    }

                }
            }

            return retorno;
        }

        public List<DeParaProdutoItau> SalvarDeParaProdutosItau(int pIdAreaSubLimite, List<DeParaProdutoItau> pProdutos)
        {
            List<DeParaProdutoItau> retorno = new List<DeParaProdutoItau>();
            List<IDataParameter> parametros = new List<IDataParameter>();

            string paramXML = Serializer.Serialize(pProdutos);

            //EventLog.WriteEntry("WebService do DePara Produto", string.Concat("ParamXML:", Environment.NewLine, paramXML));

            parametros.Add(AcessoDadosHelper.CriarParametro("@pIDT_SUB_AREA_INSL_CRED", DbType.Int16, pIdAreaSubLimite));
            parametros.Add(AcessoDadosHelper.CriarParametro("@pXML_DEPARA_PRODUTO_ITAU", DbType.Xml, paramXML));

            using (AcessoDadosHelper db = new AcessoDadosHelper(GlobalInfo.SISTEMA, GlobalInfo.LOCAL))
            {
                using (IDataReader rdr = db.ExecuteReader(CommandType.StoredProcedure, "SRCP_SALVAR_DEPARA_PRODUTO_ITAU", parametros))
                {
                    while (rdr.Read())
                    {
                        retorno.Add(new DeParaProdutoItau()
                        {
                            IdDePara = (int)base.ObterValor(rdr, "ID_DEPARA_TIPO_LIMITE_PRODUTO"),
                            Codigo = (string)base.ObterValor(rdr, "CD_CHV_PRODUTO_NC"),
                            Descricao = (string)base.ObterValor(rdr, "DS_PRODUTO_NC"),
                            CodUsuarioIncluiu = (string)base.ObterValor(rdr, "CD_USUARIO_INCLUSAO"),
                            DataInclusao = (DateTime)base.ObterValor(rdr, "DT_INCLUSAO"),
                            UtilizaProcessamento = Convert.ToBoolean((int)base.ObterValor(rdr, "IND_ATIV_INAT_PSST"))
                        });
                    }
                }
            }

            return retorno;
        }

        public List<DeParaEstrategia> SalvarDeParaEstrategia(int pIdAreaSubLimite, List<DeParaEstrategia> pEstrategias)
        {
            List<DeParaEstrategia> retorno = new List<DeParaEstrategia>();
            List<IDataParameter> parametros = new List<IDataParameter>();

            string paramXML = Serializer.Serialize(pEstrategias);

            //EventLog.WriteEntry("WebService do Depara Estrategia", string.Concat("ParamXML:", Environment.NewLine, paramXML));

            parametros.Add(AcessoDadosHelper.CriarParametro("@pIDT_SUB_AREA_INSL_CRED", DbType.Int16, pIdAreaSubLimite));
            parametros.Add(AcessoDadosHelper.CriarParametro("@pXML_DEPARA_ESTRATEGIA", DbType.Xml, paramXML));

            using (AcessoDadosHelper db = new AcessoDadosHelper(GlobalInfo.SISTEMA, GlobalInfo.LOCAL))
            {
                using (IDataReader rdr = db.ExecuteReader(CommandType.StoredProcedure, "SRCP_SALVAR_DEPARA_ESTRATEGIA", parametros))
                {
                    while (rdr.Read())
                    {
                        retorno.Add(new DeParaEstrategia()
                        {
                            IdDePara = (int)base.ObterValor(rdr, "ID_DEPARA_TIPO_LIMITE_ESTRATEGIA"),
                            Codigo = (int)base.ObterValor(rdr, "ID_ESTRATEGIA"),
                            Descricao = (string)base.ObterValor(rdr, "DS_ESTRATEGIA"),
                            CodUsuarioIncluiu = (string)base.ObterValor(rdr, "CD_USUARIO_INCLUSAO"),
                            DataInclusao = (DateTime)base.ObterValor(rdr, "DT_INCLUSAO"),
                            UtilizaProcessamento = Convert.ToBoolean((int)base.ObterValor(rdr, "IND_ATIV_INAT_PSST"))
                        });
                    }
                }
            }

            return retorno;
        }

        public List<DeParaAreaInstitucional> SalvarDeParaAreaInstitucional(int pIdAreaSubLimite, List<DeParaAreaInstitucional> pAreasInstitucionais)
        {
            List<DeParaAreaInstitucional> retorno = new List<DeParaAreaInstitucional>();
            List<IDataParameter> parametros = new List<IDataParameter>();

            string paramXML = Serializer.Serialize(pAreasInstitucionais);

            //EventLog.WriteEntry("WebService do DeParaAreaInstitucional", string.Concat("ParamXML:", Environment.NewLine, paramXML));

            parametros.Add(AcessoDadosHelper.CriarParametro("@pIDT_SUB_AREA_INSL_CRED", DbType.Int16, pIdAreaSubLimite));
            parametros.Add(AcessoDadosHelper.CriarParametro("@pXML_DEPARA_AREA_INST", DbType.Xml, paramXML));

            using (AcessoDadosHelper db = new AcessoDadosHelper(GlobalInfo.SISTEMA, GlobalInfo.LOCAL))
            {
                using (IDataReader rdr = db.ExecuteReader(CommandType.StoredProcedure, "SRCP_SALVAR_DEPARA_AREA_INSTITUCIONAL", parametros))
                {
                    while (rdr.Read())
                    {
                        retorno.Add(new DeParaAreaInstitucional()
                        {
                            IdDePara = (int)base.ObterValor(rdr, "IDT_ASSOC_TIP_LIM_AREA_INST"),
                            Codigo = (int)base.ObterValor(rdr, "COD_AREA_INST"),
                            Descricao = (string)base.ObterValor(rdr, "DS_AREA_INST"),
                            CodUsuarioIncluiu = (string)base.ObterValor(rdr, "COD_USUA_INCU"),
                            DataInclusao = (DateTime)base.ObterValor(rdr, "DAT_INCU"),
                            UtilizaProcessamento = Convert.ToBoolean((int)base.ObterValor(rdr, "IND_ATIV_INAT_PSST"))
                        });
                    }
                }
            }

            return retorno;
        }
    }
}
